home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / Talk 1.0.6 / Talk ƒ / Preferences.p < prev    next >
Encoding:
Text File  |  1992-04-20  |  7.6 KB  |  341 lines  |  [TEXT/PJMM]

  1. unit Preferences;
  2.  
  3. { This program was written by Peter N Lewis, Mar 1992 in THINK Pascal 4.0.1 }
  4.  
  5. interface
  6.  
  7.     procedure InitPreferences;
  8.     function FinishPreferences: boolean;
  9.     procedure GetPreferences (wdrn: integer; dirID: longInt; name: str63);  { used for ODoc/Params }
  10.     procedure OpenPreferences;
  11.     procedure SegmentPrefs;
  12.  
  13. implementation
  14.  
  15.     uses
  16.         MyTypes, MyUtils, MyUtilities, MyFileSystem, MyStandardFile, Folders, MySystem7,{}
  17.         BaseGlobals, AppGlobals, OOMainLoop, MyFMenus, PrefsGlobals, MyPreferences, MyDialogs;
  18.  
  19.     const
  20.         Pref_Save_item = 1;
  21.         Pref_Default_Item = Pref_Save_item;  { Must be one anyway, since we use OutlineDefault1 }
  22.         Pref_Cancel_item = 2;
  23.         User_item = 3;
  24.  
  25.         ARS_item = 4;
  26.         ARS_count = 3;
  27.         ARS_last = 6;
  28.         ARS_item_talk = 5;
  29.         NAS_item = 7;
  30.         NBS_item = 8;
  31.         NFS_item = 9;
  32.         NSS_item = 10;
  33.         ATS_item = 11;
  34.         CSS_item = 12;
  35.         RIIS_item = 13;
  36.         UNT_item = 14;
  37.         UANS_item = 15;
  38.         TBPS_item = 16;
  39.         NRDS_Item = 17;
  40.  
  41.     type
  42.         PrefsObject = object(DTObject)
  43.                 procedure Create (id: integer);
  44.                 override;
  45.                 procedure Destroy;
  46.                 override;
  47.                 procedure DoClose;
  48.                 override;
  49.                 procedure DoKey (modifiers: integer; ch: char; code: integer);
  50.                 override;
  51.                 procedure DoItem (item: integer);
  52.                 override;
  53.             end;
  54.  
  55.     var
  56.         noAlert: boolean;
  57.         prefs_fs: FSSpec;
  58.         dialog_prefs: prefsRecord;
  59.         prefs_dialog_dirty: boolean;
  60.         prefs_object: PrefsObject;
  61.  
  62.     procedure SetDialog (dp: dialogPtr);
  63.     forward;
  64.  
  65. {$S Prefs}
  66.     procedure SegmentPrefs;
  67.     begin
  68.     end;
  69.  
  70. {$S}
  71.     procedure SetPrefsMenu (themenu, theitem: integer);
  72.     begin
  73.         SetIDItemEnable(themenu, theitem, not IsWObjectFront(prefs_object));
  74.     end;
  75.  
  76. {$S Init}
  77.     procedure InitPreferences;
  78.     begin
  79.         noAlert := false;
  80.         prefs_object := nil;
  81.         GetPrefsFSSpec(prefs_fs);
  82.         JustGetPrefs(prefs);
  83.         SetFBoth(Cpreferences, @OpenPreferences, @SetPrefsMenu);
  84.     end;
  85.  
  86. {$S Prefs}
  87.     procedure GetPreferences (wdrn: integer; dirID: longInt; name: str63);
  88.         var
  89.             fs: FSSpec;
  90.             oe: OSErr;
  91.             prefs_rn, a: integer;
  92.     begin
  93.         oe := MyResolveAliasFile(wdrn, dirID, name);
  94.         fs.vRefNum := wdrn;
  95.         fs.parID := dirID;
  96.         fs.name := name;
  97.         prefs_rn := OpenPrefsFile(prefs_fs);
  98.         if prefs_rn <> -1 then begin
  99.             GetPrefs(prefs);
  100.             CloseResFile(prefs_rn);
  101.             if prefs_object <> nil then
  102.                 SetDialog(prefs_object.window);
  103.         end
  104.         else if not noAlert then
  105.             a := Alert(pref_read_alert_id, nil);
  106.     end;
  107.  
  108. {$S Prefs}
  109.     procedure SaveDefaults;
  110.     begin
  111.         JustSetprefs(prefs);
  112.     end;
  113.  
  114. {$S Term}
  115.     function FinishPreferences: boolean;
  116.     begin
  117.         if prefs_object <> nil then
  118.             prefs_object.DoClose;
  119.         FinishPreferences := prefs_object <> nil;
  120.     end;
  121.  
  122. {$S Prefs}
  123.     function GetControl (dp: dialogPtr; item: integer): boolean;
  124.         var
  125.             kind: integer;
  126.             r: rect;
  127.             h: controlHandle;
  128.     begin
  129.         GetDItem(dp, item, kind, handle(h), r);
  130.         GetControl := GetCtlValue(h) <> 0;
  131.     end;
  132.  
  133. {$S Prefs}
  134.     procedure SetControl (dp: dialogPtr; item: integer; on: boolean);
  135.         var
  136.             kind: integer;
  137.             r: rect;
  138.             h: controlHandle;
  139.     begin
  140.         GetDItem(dp, item, kind, handle(h), r);
  141.         SetCtlValue(h, ord(on));
  142.         prefs_dialog_dirty := true;
  143.     end;
  144.  
  145. {$S Prefs}
  146.     procedure SetControls (dp: dialogPtr; first, count, value: integer);
  147.         var
  148.             i: integer;
  149.     begin
  150.         for i := 0 to count - 1 do
  151.             SetControl(dp, first + i, i = value);
  152.     end;
  153.  
  154. {$S Prefs}
  155.     function GetControls (dp: dialogPtr; first, count: integer): integer;
  156.         var
  157.             i: integer;
  158.     begin
  159.         GetControls := 0;
  160.         for i := 0 to count - 1 do
  161.             if GetControl(dp, first + i) then
  162.                 GetControls := i;
  163.     end;
  164.  
  165. {$S Prefs}
  166.     procedure SetDialog (dp: dialogPtr);
  167.     begin
  168.         dialog_prefs := prefs;
  169.         with prefs do begin
  170.             SetControls(dp, ARS_item, ARS_count, ord(allowconnect));
  171.             SetControl(dp, NAS_item, notify_alert);
  172.             SetControl(dp, NBS_item, notify_beep);
  173.             SetControl(dp, NFS_item, notify_flash);
  174.             SetControl(dp, NSS_item, show_status);
  175.             SetControl(dp, ATS_item, auto_talk);
  176.             SetControl(dp, CSS_item, close_status);
  177.             SetControl(dp, RIIS_item, reply_if_idle);
  178.             SetItemText(dp, UNT_item, usernames);
  179.             SetControl(dp, UANS_item, answer_to_anyname);
  180.             SetControl(dp, TBPS_item, type_in_bottom_pane);
  181.             SetControl(dp, NRDS_Item, no_return_delete);
  182.         end;
  183.         prefs_dialog_dirty := false;
  184.     end;
  185.  
  186. {$S Prefs}
  187.     procedure GetDialog (dp: dialogPtr);
  188.     begin
  189.         prefs := dialog_prefs;
  190.         with prefs do begin
  191.             signedByte(allowconnect) := GetControls(dp, ARS_item, ARS_count);
  192.             notify_alert := GetControl(dp, NAS_item);
  193.             notify_beep := GetControl(dp, NBS_item);
  194.             notify_flash := getControl(dp, NFS_item);
  195.             show_status := GetControl(dp, NSS_item);
  196.             auto_talk := GetControl(dp, ATS_item);
  197.             close_status := GetControl(dp, CSS_item);
  198.             reply_if_idle := GetControl(dp, RIIS_item);
  199.             GetItemtext(dp, UNT_item, usernames);
  200.             ValidateUserNames(usernames);
  201.             answer_to_anyname := GetControl(dp, UANS_item);
  202.             type_in_bottom_pane := GetControl(dp, TBPS_item);
  203.             no_return_delete := GetControl(dp, NRDS_Item);
  204.         end;
  205.         prefs_dialog_dirty := false;
  206.     end;
  207.  
  208.     function DialogDirty (dp: dialogPtr): boolean;
  209.         var
  210.             usernames: str255;
  211.     begin
  212.         GetItemtext(dp, UNT_item, usernames);
  213.         ValidateUserNames(usernames);
  214.         DialogDirty := prefs_dialog_dirty or (usernames <> prefs.usernames);
  215.     end;
  216.  
  217. {$S}
  218.     procedure OpenPreferences;
  219.     begin
  220.         if prefs_object <> nil then begin
  221.             if FrontWindow <> prefs_object.window then
  222.                 SelectWindow(prefs_object.window);
  223.         end
  224.         else begin
  225.             new(prefs_object);
  226.             prefs_object.Create(pref_dialog_id);
  227.         end;
  228.     end;
  229.  
  230. {$S Prefs}
  231.     procedure PrefsObject.Create (id: integer);
  232.         var
  233.             gv: longInt;
  234.     begin
  235.         SetVersionParamText('', '');
  236.         inherited Create(id);
  237.         ok_item := Pref_Default_Item;
  238.         cancel_item := Pref_Cancel_Item;
  239.         SetUpDefaultOutline(window, Pref_Default_item, User_item);
  240.         if (Gestalt(gestaltOSAttr, gv) <> noErr) | (not BTST(gv, gestaltLaunchControl)) then begin
  241.             if prefs.allowconnect = AC_Talk then
  242.                 prefs.allowconnect := AC_Never;
  243.             HiliteItem(window, ARS_item_talk, false);
  244.         end;
  245.         SetDialog(window);
  246.         ShowWindow(window);
  247.     end;
  248.  
  249. {$S Prefs}
  250.     procedure Toggle (dp: dialogPtr; item: integer);
  251.     begin
  252.         prefs_dialog_dirty := true;
  253.         SetControl(dp, item, not GetControl(dp, item));
  254.     end;
  255.  
  256. {$S Prefs}
  257.     procedure PrefsObject.DoKey (modifiers: integer; ch: char; code: integer);
  258.     begin
  259.         prefs_dialog_dirty := true;
  260.     end;
  261.  
  262. {$S Prefs}
  263.     procedure PrefsObject.DoItem (item: integer);
  264.         procedure CheckClick (item: integer);
  265.         begin
  266.             SetControl(window, item, not GetControl(window, item));
  267.         end;
  268.         var
  269.             reply: MySFReply;
  270.             typeList: SFTypeList;
  271.             dfs: boolean;
  272.     begin
  273.         with prefs do begin
  274.             case item of
  275.                 ARS_item..ARS_last:  begin
  276.                     SetControls(window, ARS_item, ARS_count, item - ARS_item);
  277.                     prefs_dialog_dirty := true;
  278.                 end;
  279.                 NAS_item: 
  280.                     Toggle(window, NAS_item);
  281.                 NBS_item: 
  282.                     Toggle(window, NBS_item);
  283.                 NFS_item: 
  284.                     Toggle(window, NFS_item);
  285.                 NSS_item: 
  286.                     Toggle(window, NSS_item);
  287.                 ATS_item: 
  288.                     Toggle(window, ATS_item);
  289.                 CSS_item: 
  290.                     Toggle(window, CSS_item);
  291.                 RIIS_item: 
  292.                     Toggle(window, RIIS_item);
  293.                 UANS_item: 
  294.                     Toggle(window, UANS_item);
  295.                 TBPS_item: 
  296.                     Toggle(window, TBPS_item);
  297.                 NRDS_Item: 
  298.                     Toggle(window, NRDS_Item);
  299.                 Pref_Save_item:  begin
  300.                     if DialogDirty(window) then begin
  301.                         GetDialog(window);
  302.                         SaveDefaults;
  303.                     end;
  304.                     Destroy;
  305.                 end;
  306.                 Pref_Cancel_item: 
  307.                     Destroy;
  308.                 otherwise
  309.                     ;
  310.             end;
  311.         end;
  312.     end;
  313.  
  314. {$S Prefs}
  315.     procedure PrefsObject.Destroy;
  316.     begin
  317.         inherited Destroy;
  318.         prefs_object := nil;
  319.     end;
  320.  
  321. {$S Prefs}
  322.     procedure PrefsObject.DoClose;
  323.         var
  324.             dp: dialogPtr;
  325.             sc: SCType;
  326.     begin
  327.         if DialogDirty(window) then begin
  328.             sc := SaveChanges;
  329.         end
  330.         else
  331.             sc := SCDiscard;
  332.         if sc = SCSave then begin
  333.             GetDialog(window);
  334.             SaveDefaults;
  335.         end;
  336.         if sc <> SCCancel then begin
  337.             Destroy;
  338.         end;
  339.     end;
  340.  
  341. end.